// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "DataSource/GameSettingDataSourceDynamic.h" // IWYU pragma: keep
#include "GameSettingRegistry.h"
#include "Settings/LyraSettingsLocal.h" // IWYU pragma: keep

#include "LyraGameSettingRegistry.generated.h"

class ULocalPlayer;
class UObject;

//--------------------------------------
// ULyraGameSettingRegistry
//--------------------------------------

class UGameSettingCollection;
class ULyraLocalPlayer;

// 声明日志类别
DECLARE_LOG_CATEGORY_EXTERN(LogLyraGameSettingRegistry, Log, Log);

// 定义获取共享设置函数路径的宏
#define GET_SHARED_SETTINGS_FUNCTION_PATH(FunctionOrPropertyName)							\
	MakeShared<FGameSettingDataSourceDynamic>(TArray<FString>({								\
		GET_FUNCTION_NAME_STRING_CHECKED(ULyraLocalPlayer, GetSharedSettings),				\
		GET_FUNCTION_NAME_STRING_CHECKED(ULyraSettingsShared, FunctionOrPropertyName)		\
	}))

// 定义获取本地设置函数路径的宏
#define GET_LOCAL_SETTINGS_FUNCTION_PATH(FunctionOrPropertyName)							\
	MakeShared<FGameSettingDataSourceDynamic>(TArray<FString>({								\
		GET_FUNCTION_NAME_STRING_CHECKED(ULyraLocalPlayer, GetLocalSettings),				\
		GET_FUNCTION_NAME_STRING_CHECKED(ULyraSettingsLocal, FunctionOrPropertyName)		\
	}))

/**
 * Lyra游戏设置注册表类
 */
UCLASS()
class ULyraGameSettingRegistry : public UGameSettingRegistry
{
	GENERATED_BODY()

public:
	ULyraGameSettingRegistry();

	/**
	 * 获取指定本地玩家的游戏设置注册表
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置注册表实例
	 */
	static ULyraGameSettingRegistry* Get(ULyraLocalPlayer* InLocalPlayer);
	
	/**
	 * 保存设置更改
	 */
	virtual void SaveChanges() override;

protected:
	/**
	 * 初始化设置注册表
	 * @param InLocalPlayer 本地玩家对象
	 */
	virtual void OnInitialize(ULocalPlayer* InLocalPlayer) override;
	
	/**
	 * 检查是否已完成初始化
	 * @return 如果已完成初始化返回true，否则返回false
	 */
	virtual bool IsFinishedInitializing() const override;

	/**
	 * 初始化视频设置
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置集合
	 */
	UGameSettingCollection* InitializeVideoSettings(ULyraLocalPlayer* InLocalPlayer);
	
	/**
	 * 初始化视频设置-帧率
	 * @param Screen 游戏设置集合
	 * @param InLocalPlayer 本地玩家对象
	 */
	void InitializeVideoSettings_FrameRates(UGameSettingCollection* Screen, ULyraLocalPlayer* InLocalPlayer);
	
	/**
	 * 添加性能统计页面
	 * @param Screen 游戏设置集合
	 * @param InLocalPlayer 本地玩家对象
	 */
	void AddPerformanceStatPage(UGameSettingCollection* Screen, ULyraLocalPlayer* InLocalPlayer);

	/**
	 * 初始化音频设置
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置集合
	 */
	UGameSettingCollection* InitializeAudioSettings(ULyraLocalPlayer* InLocalPlayer);
	
	/**
	 * 初始化游戏玩法设置
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置集合
	 */
	UGameSettingCollection* InitializeGameplaySettings(ULyraLocalPlayer* InLocalPlayer);

	/**
	 * 初始化鼠标和键盘设置
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置集合
	 */
	UGameSettingCollection* InitializeMouseAndKeyboardSettings(ULyraLocalPlayer* InLocalPlayer);
	
	/**
	 * 初始化游戏手柄设置
	 * @param InLocalPlayer 本地玩家对象
	 * @return 游戏设置集合
	 */
	UGameSettingCollection* InitializeGamepadSettings(ULyraLocalPlayer* InLocalPlayer);

	UPROPERTY()
	TObjectPtr<UGameSettingCollection> VideoSettings; // 视频设置集合

	UPROPERTY()
	TObjectPtr<UGameSettingCollection> AudioSettings; // 音频设置集合

	UPROPERTY()
	TObjectPtr<UGameSettingCollection> GameplaySettings; // 游戏玩法设置集合

	UPROPERTY()
	TObjectPtr<UGameSettingCollection> MouseAndKeyboardSettings; // 鼠标和键盘设置集合

	UPROPERTY()
	TObjectPtr<UGameSettingCollection> GamepadSettings; // 游戏手柄设置集合
};